import axios from 'axios'
import qs from 'qs'

// 根据环境变量区分接口默认地址
// switch(process.env.NODE_ENV){
//     case 'production'  :  
//         axios.defaults.baseURL = '';
//         break;
//     case 'test':
//         axios.defaults.baseURL = '';
//         break;
//     default:
//         axios.defaults.baseURL = '';
// }
// 设置默认参数
const instance = axios.create({
    baseURL: 'http://127.0.0.1',
    timeout: 3000,
    withCredentials: true,
})
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.transformRequest = data => qs.stringify(data);


const pendingMap = new Map();
const customConfig = {
        repeat_cancel: true,
        // isFormData: false,
    }
    // 设置拦截器
    //请求拦截器
instance.interceptors.request.use(config => {
    config = Object.assign(customConfig, config)
    removePending(config);
    config.repeat_cancel && addPending(config);
    // 对表单进行处理
    let newParams = {};
    if (config.data && config.isFormData) {
        newParams = new FormData();
        for (let i in data) {
            newParams.append(i, params[i]);
        }
    } else {
        newParams = params;
    }
    config.data = newParams;
    // 登录功能扩展时携带token，这个token需要自己存入localstorage
    let token = localStorage.getItem('token');
    // 如果携带token
    token && (config.headers.Authorization = token);
    return config;
}, error => {
    return Promise.reject(error);
});

//响应拦截器
instance.interceptors.response.use(response => {
    removePending(response.config);
    return response.data;
}, error => {
    let { response } = error
    if (response) {
        //请求不成功但返回结果
        switch (response.status) {
            case 401:
                console.log('权限不足，请登录');
                break;
            case 403:
                console.log('登录已过期');
                break;
            case 404:
                console.log("当前接口不存在");
                break;
        }
    } else {
        //服务器完全没有返回结果（网络问题或服务器崩溃）
        if (!window.navigator.onLine) {
            //断网处理，跳转404页面
            console.log('断网了！')
        }
        return Promise.reject(error);
    }
});
/**
 * 储存每个请求的唯一cancel回调, 以此为标识
 * @param {*} config 
 */
function addPending(config) {
    const pendingKey = getPendingKey(config);
    config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
        if (!pendingMap.has(pendingKey)) {
            pendingMap.set(pendingKey, cancel);
        }
    });
}

/**
 * 删除重复的请求
 * @param {*} config 
 */
function removePending(config) {
    const pendingKey = getPendingKey(config);
    if (pendingMap.has(pendingKey)) {
        const cancelToken = pendingMap.get(pendingKey);
        // cancelToken()这里传递的pendingKey可以给到上面异常处理传递一个提示信息，查看控制台能打印取消的接口情况。
        // if(axios.isCancel(error)) return console.error('请求的重复请求：' + error.message);
        cancelToken(pendingKey);
        pendingMap.delete(pendingKey);
    }
}

/**
 * 生成唯一的每个请求的唯一key
 * @param {*} config 
 * @returns 
 */
function getPendingKey(config) {
    let { url, method, params, data } = config;
    if (typeof data === 'string') data = JSON.parse(data); // response里面返回的config.data是个字符串对象
    return [url, method, JSON.stringify(params), JSON.stringify(data)].join('&');
}

export default instance;